package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.common.constant.MqConst;
import com.atguigu.gmall.common.service.RabbitService;
import com.atguigu.gmall.product.service.*;
import com.atguigu.gmall.product.mapper.SkuAttrValueMapper;
import com.atguigu.gmall.product.mapper.SpuSaleAttrMapper;
import com.atguigu.gmall.product.model.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.List;

@SuppressWarnings("all")
@Service
public class SkuManageServiceImpl implements SkuManageService {

    @Autowired
    private SkuInfoService skuInfoService;
    @Autowired
    private SkuAttrValueService skuAttrValueService;
    @Autowired
    private SkuImageService skuImageService;
    @Autowired
    private SkuSaleAttrValueService skuSaleAttrValueService;
    @Autowired
    private SpuSaleAttrService spuSaleAttrService;
    @Autowired
    private SkuAttrValueMapper skuAttrValueMapper;
    @Autowired
    private RabbitService rabbitService;

    /**
     * 根据销售属性id查询销售属性集合
     * @param spuId
     * @return
     */
    @Override
    public List<SpuSaleAttr> getSpuSaleAttrList(Long spuId) {
        //1.获取销售属性id,调用自定义sql语句
        SpuSaleAttrMapper spuSaleAttrMapper = (SpuSaleAttrMapper) spuSaleAttrService.getBaseMapper();
       List<SpuSaleAttr> list = spuSaleAttrMapper.getSpuSaleAttrList(spuId);
        //2.返回给控制层
        return list;
    }

    /**
     * 保存Sku集合
     * 1.将提交商品信息封装成skuInfo对象,存到sku_info表
     * 2.将提交商品图片信息封装成skuImage集合,存到sku_image表
     * 3.将提交商品平台属性封装成skuAttrValue集合,存到sku_attr_value表
     * 4.将提交商品销售属性封装成skuSaleAttrValue集合,存到sku_sale_attr_value表
     * @param skuInfo
     * @return
     */
    @Override
    public void saveSkuInfo(SkuInfo skuInfo) {
        //1.将提交商品信息封装成skuInfo对象,存到sku_info表
        skuInfoService.save(skuInfo);
        Long skuId = skuInfo.getId();
        //2.将提交商品图片信息封装成skuImage集合,存到sku_image表
        List<SkuImage> skuImageList = skuInfo.getSkuImageList();
        if(!CollectionUtils.isEmpty(skuImageList)){
            skuImageList.stream().forEach(skuImage -> {
                skuImage.setSkuId(skuId);
            });
            //批保存
            skuImageService.saveBatch(skuImageList);
        }
        //3.将提交商品平台属性封装成skuAttrValue集合,存到sku_attr_value表
        List<SkuAttrValue> skuAttrValueList = skuInfo.getSkuAttrValueList();
        if(!CollectionUtils.isEmpty(skuAttrValueList)){
            skuAttrValueList.stream().forEach(skuAttrValue -> {
                skuAttrValue.setSkuId(skuId);
            });
            //批量保存
            skuAttrValueService.saveBatch(skuAttrValueList);
        }
        //4.将提交商品销售属性封装成skuSaleAttrValue集合,存到sku_sale_attr_value表
        List<SkuSaleAttrValue> skuSaleAttrValueList = skuInfo.getSkuSaleAttrValueList();
        if(!CollectionUtils.isEmpty(skuSaleAttrValueList)){
            skuSaleAttrValueList.stream().forEach(skuSaleAttrValue -> {
                skuSaleAttrValue.setSkuId(skuId);
                skuSaleAttrValue.setSkuId(skuInfo.getSpuId());
            });
            //批量保存
            skuSaleAttrValueService.saveBatch(skuSaleAttrValueList);
        }
    }

    /**
     * 根据分类id查sku列表并分页
     * @param infoPage
     * @param category3Id
     * @return
     */
    @Override
    public Page<SkuInfo> getSkuListById(Page<SkuInfo> infoPage, Long category3Id) {
        LambdaQueryWrapper<SkuInfo> queryWrapper = new LambdaQueryWrapper<SkuInfo>();
        queryWrapper.eq(SkuInfo::getCategory3Id,category3Id );
        //根据更新时间排序
        queryWrapper.orderByDesc(SkuInfo::getUpdateTime);
        Page<SkuInfo> page = skuInfoService.page(infoPage, queryWrapper);
        return page;
    }

    /**
     * 上架
     * @param skuId
     */
    @Override
    public void onSale(Long skuId) {
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);
        skuInfo.setIsSale(1);
        skuInfoService.updateById(skuInfo);
    }

    /**
     * 下架
     * @param skuId
     */
    @Override
    public void cancelSale(Long skuId) {
        LambdaUpdateWrapper<SkuInfo> updateWrapper = new LambdaUpdateWrapper<SkuInfo>();
        //1.设置更新条件
        updateWrapper.eq(SkuInfo::getId,skuId);
        //1.1设置更新字段值
        updateWrapper.set(SkuInfo::getIsSale,0);
        skuInfoService.update(updateWrapper);

        //2.将来还要同步索引库es的商品进行下架,需要删除商品缓存到Redis
        rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_GOODS, MqConst.ROUTING_GOODS_LOWER,skuId);
    }

    /**
     * 根据skuId查商品信息包含图片列表
     * @param skuId
     * @return
     */
    @Override
    public SkuInfo getSkuInfo(Long skuId) {
        //.根据主键查询sku_info表得到商品信息
        SkuInfo skuInfo = skuInfoService.getById(skuId);
        if(skuInfo != null){
            //根据商品信息查询sku_image表获得商品图片列表
            LambdaQueryWrapper<SkuImage> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SkuImage::getSkuId,skuId);
            List<SkuImage> skuImageList = skuImageService.list(queryWrapper);
            //将skuImage列表封装到SkuInfo表
            skuInfo.setSkuImageList(skuImageList);
            return skuInfo;
        }
        return null;
    }

    /**
     * 根据SKUID查询价格信息
     * @param skuId
     * @return
     */
    @Override
    public BigDecimal getSkuPrice(Long skuId) {
        LambdaQueryWrapper<SkuInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SkuInfo::getId, skuId);
        queryWrapper.select(SkuInfo::getPrice);
        SkuInfo skuInfo = skuInfoService.getOne(queryWrapper);
        if(skuInfo != null){
            return skuInfo.getPrice();
        }
        return new BigDecimal("0.00");
    }
}